//
//  GLESPrim.m
//  DrawColorPolygon
//
//  Created by 畑圭輔 on 10/03/07.
//  Copyright 2010 Keisuke Hata. All rights reserved.
//

#import "UIGLESSettingViewController.h"
#import "GLESPrim.h"

@implementation EAGLPrim

@synthesize mode;

@end

@implementation EAGLPoly

// GL_TRIANGLESによる描画
- (void) drawTriangles
{
	GLfloat vertices[] = 
	{
		// 三角形1(X,Y)
		20		,50,
		20		,150,
		20+100	,150,
		
		// 三角形2(X,Y)
		20		,50,
		20 + 100,50,
		20 + 100,150,
	};
	GLubyte colors[] = 
	{
		// 三角形1
		_RGBA( 255,0,0,255 ),
		_RGBA( 255,0,0,255 ),
		_RGBA( 255,0,0,255 ),
		
		// 三角形2
		_RGBA( 0,255,0,255 ),
		_RGBA( 0,255,0,255 ),
		_RGBA( 0,255,0,255 ),
	};
	
	glEnableClientState( GL_VERTEX_ARRAY );
	glEnableClientState( GL_COLOR_ARRAY);
	
	// 頂点データ(3頂点) x 2
	glVertexPointer( 2 , GL_FLOAT , 0 , vertices );
	// カラーデータ：フォーマット(RGBA)[4]
	glColorPointer( 4, GL_UNSIGNED_BYTE, 0, colors );
	// 三角形(3頂点) x 2を描画
	glDrawArrays(GL_TRIANGLES, 0, 3*2);
	
	glDisableClientState( GL_COLOR_ARRAY);
	glDisableClientState( GL_VERTEX_ARRAY);
}

// GL_TRIANGLE_STRIPによる描画
- (void) drawStrip
{
	GLfloat vertices[] = 
	{
		20     ,50,
		20+100 ,50,
		20     ,150,
		20+100 ,150,
	};

	GLubyte colors[] = 
	{
		_RGBA( 255,0,  0,255 ),
		_RGBA( 255,0,  0,255 ),
		_RGBA( 255,0,  0,255 ),
		_RGBA( 0,  255,0,255 ),
	};
	
	glEnableClientState( GL_VERTEX_ARRAY );
	glEnableClientState( GL_COLOR_ARRAY);
		
	// 頂点データ(3頂点) x 2
	glVertexPointer( 2 , GL_FLOAT , 0 , vertices );
	// カラーデータ：フォーマット(RGBA)[4]
	glColorPointer(4, GL_UNSIGNED_BYTE, 0, colors );
	// 描画( 4頂点分 ) => STRIPでつながっている為(頂点数は、4)
	glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
	
	glDisableClientState( GL_COLOR_ARRAY);
	glDisableClientState( GL_VERTEX_ARRAY);	
}

// GL_TRIANGLE_FANによる描画
- (void) drawFan
{
	GLfloat vertices[] = 
	{
		20       , 50  , 
		20       , 150 , 
		(20+100) , 150 , 
		(20+100) , 50  , 
	};
	GLubyte colors[] = 
	{
		_RGBA( 255,0,  0,255 ),
		_RGBA( 255,0,  0,255 ),
		_RGBA( 255,0,  0,255 ),
		_RGBA( 0,  255,0,255 ),
	};
	
	glEnableClientState( GL_VERTEX_ARRAY );
	glEnableClientState( GL_COLOR_ARRAY);
	
	// 頂点データ(3頂点) x 2
	glVertexPointer( 2 , GL_FLOAT , 0 , vertices );
	// カラーデータ：フォーマット(RGBA)[4]
	glColorPointer(4, GL_UNSIGNED_BYTE, 0, colors );
	// 描画( 4頂点分 ) => FANでつながっている為(頂点数は、4)
	glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
	
	glDisableClientState( GL_COLOR_ARRAY);
	glDisableClientState( GL_VERTEX_ARRAY);	
}

- (void) draw
{
	switch (mode) {
		case kEAGL_POLY_TRIANGLES:
			[self drawTriangles];
			break;
			
		case kEAGL_POLY_STRIP:
			[self drawStrip];
			break;
			
		case kEAGL_POLY_FAN:
			[self drawFan];
			break;
			
		default:
			NSAssert( 0 , @"未定義の描画方法" );
			break;
	}
	return;
}

@end

@implementation EAGLLine

@synthesize lineSmooth;
@synthesize lineWidth;

// GL_LINESによる線分描画
- (void) drawLines
{
	// 2点をペアにして線を描画
	GLfloat vertices[] = 
	{
		// 1本目
		20 , 220, 
		40 , 320, 
		
		// 2本目
		80  , 220, 
		130 , 320, 
	};
	GLubyte colors[] = 
	{
		_RGBA( 0,255,0,   255 ),
		_RGBA( 255,255,0, 255 ),
		
		_RGBA( 255,0,255, 255 ),
		_RGBA( 255,0,255, 255 ),
	};

	glEnableClientState( GL_VERTEX_ARRAY );
	glEnableClientState( GL_COLOR_ARRAY);
	
	// 頂点データ(2頂点) x 2
	glVertexPointer( 2 , GL_FLOAT , 0 , vertices );
	// カラーデータ：フォーマット(RGBA)[4]
	glColorPointer( 4, GL_UNSIGNED_BYTE, 0, colors );
	
	// 線の太さ
	int lineOldWidth = lineWidth;
	glLineWidth(lineWidth);
	
	// 線分を描画
	glDrawArrays(GL_LINES, 0, 4);
	
	// 元の太さに戻す
	glLineWidth(lineOldWidth);
	
	glDisableClientState( GL_COLOR_ARRAY);
	glDisableClientState( GL_VERTEX_ARRAY);	
}

// GL_LINE_LOOPによる描画
- (void) drawLineLoop
{
	// 折れ線描画(始点と終点を結びます)
	GLfloat vertices[] = 
	{
		20  , 220  , 
		40  , 320 , 
		130 , 320 , 
		80  , 220  , 
	};
	GLubyte colors[] = 
	{
		_RGBA( 0,255,0,   255 ),
		_RGBA( 255,255,0, 255 ),
		_RGBA( 255,0,255, 255 ),
		_RGBA( 255,0,255, 255 ),
	};

	glEnableClientState( GL_VERTEX_ARRAY );
	glEnableClientState( GL_COLOR_ARRAY);

	// 線の太さ
	int oldLineWidth = lineWidth;
	glLineWidth(lineWidth);
	
	// 頂点データ(2頂点) x 2
	glVertexPointer( 2 , GL_FLOAT , 0 , vertices );
	// カラーデータ：フォーマット(RGBA)[4]
	glColorPointer(4, GL_UNSIGNED_BYTE, 0, colors );
	
	// 線分を描画( ４頂点 )
	glDrawArrays(GL_LINE_LOOP, 0, 4);
	
	// 元の太さに戻す
	glLineWidth( oldLineWidth );
	
	glDisableClientState( GL_COLOR_ARRAY);
	glDisableClientState( GL_VERTEX_ARRAY);	
}

// GL_LINE_STRIPによる描画
- (void) drawLineStrip
{
	// 折れ線描画
	GLfloat vertices[] = 
	{
		20  , 220, 
		80  , 220, 
		40  , 240, 
		140 , 240, 
	};
	GLubyte colors[] = 
	{
		_RGBA( 0,255,0,   255 ),
		_RGBA( 255,255,0, 255 ),
		_RGBA( 255,0,255, 255 ),
		_RGBA( 255,0,255, 255 ),
	};
	glEnableClientState( GL_VERTEX_ARRAY );
	glEnableClientState( GL_COLOR_ARRAY);

	// 線の太さ
	int oldLineWidth = lineWidth;
	glLineWidth(lineWidth);
	
	// 頂点データ(2頂点) x 2
	glVertexPointer( 2 , GL_FLOAT , 0 , vertices );
	// カラーデータ：フォーマット(RGBA)[4]
	glColorPointer( 4, GL_UNSIGNED_BYTE, 0, colors );
	// 線分を描画( 4頂点 )
	glDrawArrays(GL_LINE_STRIP, 0, 4);

	// 元の太さに戻す
	glLineWidth(oldLineWidth); 
	
	glDisableClientState( GL_COLOR_ARRAY);
	glDisableClientState( GL_VERTEX_ARRAY);	
}

-(void) draw
{
	switch (mode) {
		case kEAGL_LINE_LINES:
			[self drawLines];
			break;
			
		case kEAGL_LINE_LOOP:
			[self drawLineLoop];
			break;
			
		case kEAGL_LINE_STRIP:
			[self drawLineStrip];
			break;
			
		default:
			NSAssert( 0 , @"未定義の描画方法" );
			break;
	}
}

@end
